package com.example.matchers;

import org.junit.Test;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author readpage
 * @create 2022-10-31 10:05
 */
public class RegexExample {
    // https://tool.oschina.net/uploads/apidocs/jquery/regexp.html 正则表达式

    /**
     *   *	匹配前面的子表达式零次或多次。例如，zo*能匹配“z”以及“zoo”。*等价于{0,}。
     *   +	匹配前面的子表达式一次或多次。例如，“zo+”能匹配“zo”以及“zoo”，但不能匹配“z”。+等价于{1,}。
     *   ?	匹配前面的子表达式零次或一次。例如，“do(es)?”可以匹配“does”或“does”中的“do”。?等价于{0,1}。
     *   .	匹配除“\n”之外的任何单个字符。要匹配包括“\n”在内的任何字符，请使用像“(.|\n)”的模式。
     *   \d	匹配一个数字字符。等价于[0-9]。
     *   (pattern)	匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到，在VBScript中使用SubMatches集合，在JScript中则使用$0…$9属性。要匹配圆括号字符，请使用“\(”或“\)”。
     *   \d	匹配一个数字字符。等价于[0-9]。
     *   \D	匹配一个非数字字符。等价于[^0-9]。
     *   \b	匹配一个单词边界，也就是指单词和空格间的位置。例如，“er\b”可以匹配“never”中的“er”，但不能匹配“verb”中的“er”。
     */
    @Test
    public void test() {
        String content = "hello world!字符串匹配";
        String pattern = ".*world.*";
        boolean isMatch = Pattern.matches(pattern, content);
        System.out.println("字符串是否包含了了'world'子字符串? " + isMatch);
    }

    /**
     * 捕获组
     * 捕获组是把多个字符当一个单独单元进行处理的方法，它通过对括号内的字符分组来创建。
     */
    @Test
    public void test2() {
        // 按指定模式在字符串查找
        String line = "This order was placed for QT3000! OK?";
        String pattern = "(\\D*)(\\d+)(.*)";

        // 创建 Pattern 对象
        Pattern r = Pattern.compile(pattern);

        // 现在创建 matcher 对象
        Matcher m = r.matcher(line);
        //	public boolean find()
        //  尝试查找与该模式匹配的输入序列的下一个子序列。
        if (m.find()) {
            System.out.println("Found value:" + m.group(0));
            System.out.println("Found value:" + m.group(1));
            System.out.println("Found value:" + m.group(2));
            System.out.println("Found value:" + m.group(3));
        } else {
            System.out.println("NO MATCH");
        }
    }

    //对单词 "cat" 出现在输入字符串中出现次数进行计数的例子
    @Test
    public void test3() {
         String regex = "\\bcat\\b";
         String input = "cat cat cat cattie cat";

        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(input);  // 获取 matcher 对象
        int count = 0;

        while (m.find()) {
            count++;
            System.out.println("Match number " + count);
            System.out.println("start():" + m.start());
            System.out.println("end():" + m.end());
        }
    }

    // replaceFirst 和 replaceAll 方法用来替换匹配正则表达式的文本。不同的是，replaceFirst 替换首次匹配，replaceAll 替换所有匹配。
    @Test
    public void test4() {
        String regex = "dog";
        String input = "The dog say meow. All dogs say meow.";
        String replace = "cat";
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(input);
        System.out.println(m.replaceFirst(replace));
        System.out.println(m.replaceAll(replace));
    }

    @Test
    public void test5() {
        String str = "其他‘iw11月。";
        System.out.println(str.replaceAll("\\D", ""));
    }
}
